#ifndef NETWORKSERVICES_CHANNEL_H
#define NETWORKSERVICES_CHANNEL_H

#include <atomic>
#include <functional>

class EventLoop;

class Channel {
public:
    Channel(EventLoop *loop, int fd);
    ~Channel() = default;
    void UseEt();           // 使用边缘触发
    void EnableReading();
    void DisableReading();
    void EnableWriting();
    void DisableWriting();
    void DisableAll();
    void Remove();
    void HandleEvent() const;

public:
    std::function<void()> onRead;
    std::function<void()> onClose;
    std::function<void()> onError;
    std::function<void()> onWrite;

    int fd = -1;                         // Channel拥有的fd，Channel和fd是一对一的关系
    std::atomic<bool> inEpoll = false;   // Channel是否已添加到epoll树上
    uint32_t events = 0;                 // fd需要监视的事件
    uint32_t revents = 0;                // fd已发生的事件

private:
    EventLoop *loop;                     // Channel对应的事件循环，Channel与EventLoop是多对一的关系，一个Channel只对应一个EventLoop。
};


#endif //NETWORKSERVICES_CHANNEL_H
